package br.com.velp.sudecap.mb.decreto;

import br.com.velp.sudecap.comum.BaseController;
import br.com.velp.sudecap.datamodel.ImovelDataModel;
import br.com.velp.sudecap.dto.ImovelParametrosConsultaDTO;
import br.com.velp.sudecap.entidade.Imovel;
import br.com.velp.sudecap.entidade.ImovelDecreto;
import br.com.velp.sudecap.service.EmpreendimentoService;
import br.com.velp.sudecap.service.ImovelDecretoService;
import br.com.velp.sudecap.service.ImovelService;
import br.com.velp.sudecap.web.util.MensagemUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.faces.model.SelectItem;
import org.apache.commons.lang.StringUtils;
import org.lindbergframework.spring.scope.AccessScoped;
import org.primefaces.component.datatable.DataTable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * <sumario> <objetivo> "Rastreabilidade" </objetivo> <autor> EDUARDO SANTOS DE
 * OLIVEIRA </autor> <versao>1.0.0.0</versao> <data_criacao> 17.10.2012
 * </data_criacao> <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisito_afetado> RF004.03 - Relacionar Imóveis x Decretos
 * </requisito_afetado> <descricao> Managead Bean responsável por gerenciar a
 * associação de Imóveis Com Decretos </descricao> </sumario>
 */
@Controller("imovelDecreto")
@AccessScoped
public class AssociarImovelDecreto extends BaseController {

    private List<SelectItem> listaRegionais;
    private List<ImovelDecreto> imoveisDoDecreto;
    private ImovelDataModel dataModel;
    private ImovelParametrosConsultaDTO parametros;
    private Imovel[] imoveisSelecionados;
    private Long idDecretoSelecionado;
    private DataTable dataTable;
    
    @Autowired
    private ImovelService imovelService;
    
    @Autowired
    private EmpreendimentoService empreendimentoService;
    
    @Autowired
    private ImovelDecretoService imovelDecretoService;

    public void initImoveisDoDecreto() {
        
        resetarFormulario("fDecretoImovel");
	this.imoveisDoDecreto = this.imovelDecretoService.recuperarImoveisDoDecreto(this.idDecretoSelecionado);
        
    }

    public void initPainelSelecaoImoveis() {
	
        resetarFormulario("fConsultarImoveis");
        
	this.listaRegionais = obterSelectItemPopulado(this.empreendimentoService.recuperarTodasRegionais(), "id", "nome");
	this.dataModel = null;
	this.imoveisSelecionados = null;
	this.parametros = new ImovelParametrosConsultaDTO();
	
    }

    public void pesquisarImoveis() {
	
	this.parametros.setImoveisNotIn(getImoveisNotIn());
	this.dataModel = new ImovelDataModel(this.imovelService, this.parametros);
	
    }

    public void selecionarDecretos() {
	
	if (this.imoveisSelecionados == null || this.imoveisSelecionados.length == 0) {
	    MensagemUtil.exibirMensagemAlerta("modal", MensagemUtil.getMensagem("decretoImovelNenhumImovelSelecionado"));
	} else {
	    this.imovelDecretoService.adicionarImoveisAoDecreto(
		    this.idDecretoSelecionado,
		    Arrays.asList(this.imoveisSelecionados));
	    initImoveisDoDecreto();
	    MensagemUtil.exibirMensagemInformacao("modal", MensagemUtil.getMensagem("decretoImovelAdicionados"));
	}
	
    }

    private List<Long> getImoveisNotIn() {
	
	List<Long> imoveis = new ArrayList<Long>();
	
	for (ImovelDecreto imovelDecreto : this.imoveisDoDecreto) {
	    imoveis.add(imovelDecreto.getImovel().getId());
	}
	
	return imoveis;
	
    }

    public void atualizarImovelDecreto(ImovelDecreto imovelDecreto) {
	this.imovelDecretoService.atualizarStatusImovelDecreto(imovelDecreto);
    }

    public void atualizarImovel(ImovelDecreto imovelDecreto) {
	imovelDecreto.setSituacao(!imovelDecreto.getSituacao());
	this.imovelDecretoService.atualizarStatusImovelDecreto(imovelDecreto);
    }

    public void fecharPainelAssociacaoImovelDecreto() {

	boolean fechavel = true;

	for (ImovelDecreto imovelDecreto : this.imoveisDoDecreto) {
	    if (imovelDecreto.getSituacao() != null && !imovelDecreto.getSituacao()
		    && StringUtils.isBlank(imovelDecreto.getMotivo())) {
		fechavel = false;
		break;
	    }
	}

	if (fechavel) {
	    ocultarPainelDialog("pnDecretoImovel");
	} else {
	    MensagemUtil.exibirMensagemAlerta("modal", MensagemUtil.getMensagem("decretoExistemImoveisInativosSemMovitoInativacaoDefinidos"));
	}

    }

    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">        
    public ImovelDataModel getDataModel() {
	return dataModel;
    }

    public void setDataModel(ImovelDataModel dataModel) {
	this.dataModel = dataModel;
    }

    public List<SelectItem> getListaRegionais() {
	return listaRegionais;
    }

    public void setListaRegionais(List<SelectItem> listaRegionais) {
	this.listaRegionais = listaRegionais;
    }

    public ImovelParametrosConsultaDTO getParametros() {
	return parametros;
    }

    public void setParametros(ImovelParametrosConsultaDTO parametros) {
	this.parametros = parametros;
    }

    public Imovel[] getImoveisSelecionados() {
	return imoveisSelecionados;
    }

    public void setImoveisSelecionados(Imovel[] imoveisSelecionados) {
	this.imoveisSelecionados = imoveisSelecionados;
    }

    public List<ImovelDecreto> getImoveisDoDecreto() {
	return this.imoveisDoDecreto;
    }

    public void setImoveisDoDecreto(List<ImovelDecreto> imoveisDoDecreto) {
	this.imoveisDoDecreto = imoveisDoDecreto;
    }

    public Long getIdDecretoSelecionado() {
	return this.idDecretoSelecionado;
    }

    public void setIdDecretoSelecionado(Long idDecretoSelecionado) {
	this.idDecretoSelecionado = idDecretoSelecionado;
    }

    public DataTable getDataTable() {
	return dataTable;
    }

    public void setDataTable(DataTable dataTable) {
	this.dataTable = dataTable;
    }
    // </editor-fold>    
}
